package LeetCode;
import java.util.*;
public class LeetCodeMain11 {
    List<List<Integer>> list=new ArrayList<>();
    List<Integer> list1=new ArrayList<>();
    public List<List<Integer>> permute(int[] nums) {
        boolean[] booleans=new boolean[nums.length];
        back(nums,booleans);
        return list;
    }
    public void back(int[] nums,boolean[] used){
        if (list1.size()== nums.length){
            list.add(new ArrayList<>(list1));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (used[i]!=true){
                list1.add(nums[i]);
                used[i]=true;
            }else {
                continue;
            }
            back(nums,used);
            used[i]=false;
            list1.remove(list1.size()-1);
        }
    }
    public List<List<Integer>> findSubsequences(int[] nums) {
        back1(nums,0);
        return list;
    }
    public void back1(int[] nums,int startIndex){
        if (list1.size()>=2){
            list.add(new ArrayList<>(list1));
        }
        int used[]=new int[201];
        for (int i = startIndex; i < nums.length; i++) {
            if ((!list1.isEmpty()&&list1.get(list1.size()-1)>nums[i])||used[nums[i]+100]==1){
                continue;
            }
            used[nums[i]+100]=1;
            list1.add(nums[i]);
            back1(nums,i+1);
            list1.remove(list1.size()-1);
        }
    }
}
